EXPORT DEF gad_writeid, gad_download, gad_progress:PTR TO simplegauge_plugin, gad_abort
EXPORT PROC fleWrite(force=FALSE, arexx=NIL:PTR TO arxArgs) HANDLE
->-
->- procedura zapisujâca opis pîyty kompaktowej na dysk do pliku o nazwie
->- zgodej z CDID
->- jako pierwsze nastëpuje sprawdzenie czy opis do danej pîytki juû jest
->- ôciâgniëty z internetu (jest w disks) czy nie
->- zwraca 0 w przypadku powodzenia lub wskaúnik do opisu bîëdu
->-
DEF cd, filename, handle=NIL
DEF path[255]:STRING
guiGadgetAble(gad_download, TRUE)
guiGadgetAble(gad_abort, TRUE)
IF (cd := cdCreateInfo())=NIL THEN Raise('CD-ROM is empty! Please\ninsert disc and try again')
filename := cdFileId(cd)
IF (force = FALSE)
->-
->- sprawdzenie czy pîytka ma juû opis (w katalogu DISKS)
->-
StrCopy(path, tt_disks)
AddPart(path, filename, 255)
IF FileLength(path)<>(-1)
->-
->- plik juû istnieje
->-
IF guiInformUser('Description file for this CD\n already exists! Save anyway?', '_Ok|_Cancel')=FALSE THEN Raise()
ENDIF
ENDIF
->-
->- zapisywanie do katalogu TEMP
->-
StrCopy(path, tt_temp)
AddPart(path, filename, 255)
IF (handle := Open(path, MODE_NEWFILE))
->-
->- zapis danych do pliku o nazwie FILEID
->-
cdWriteInfo(cd, handle)
D('[FLEWRITE] write to file \s\n', [path, NIL])
Close(handle)
ELSE
Raise('Write error!\nCannot write to the TEMP directory!')
ENDIF
EXCEPT DO
guiGadgetAble(gad_download, FALSE)
IF (cd) THEN cdFreeInfo(cd)
IF (exception)
D('[FLEWRITE] error \s\n', [exception, NIL])
IF (arexx)
->-
->- procedura zostaîa wywoîana z poziomu arexx'a wiëc wszelkie komunikaty
->- o bîëdach wîaônie tam bëdâ przekazane
->-
arexx.err := exception
arexx.rclong := 0
ELSE
->-
->- domyôlnie bëdzie wyôwietlony requester
->-
DisplayBeep(NIL)
guiInformUser(exception, NIL, exceptioninfo)
ENDIF
ENDIF
ENDPROC (exception = NIL)
EXPORT PROC fleDownload(filecd=NIL, arexx=NIL:PTR TO arxArgs) HANDLE
->-
->- procedura przetwarzajâca dane zebrane w katalogu TEMP
->- dla kaûdego pliku îâczy sië z CDDB i pobiera wszystkie opisy
->-
DEF setup_net=FALSE, files:lh, cd, rc=FALSE, i=0, bad=0, max
DEF tmp[255]:STRING
newList(files)
IF (setup_net := netSetup())=FALSE THEN Raise('Can not open bsdsocket.library!\nPlease make sure that\nTCP/IP stack is running')
D('[DOWNLOAD] flip gadgets\n', NIL)
guiGadgetAble(gad_writeid, TRUE)
guiGadgetAble(gad_download, TRUE)
guiGadgetAble(gad_abort, FALSE)
IF (filecd)
->-
->- download tylko tego jednego pliku
->- okreôlonego przez strukturë cdinfo
->-
AddHead(files, filecd)
ELSE
->-
->- downloading wszystkich opisów z katalogu TEMP
->-
D('[DOWNLOAD] scan TEMP directory\n', NIL)
gad_progress.set(PLA_SimpleGauge_Current, i)
IF scanfiles(files, tt_temp)=FALSE THEN Raise('Can not scan TEMP directory!\nProbably wrong or missing TOOLTYPE')
IF IsListEmpty(files) THEN Raise('TEMP directory is EMPTY!\nFirst you must create some cdid files')
ENDIF
max := countfiles(files)
gad_progress.set(PLA_SimpleGauge_Max, max)
WHILE (cd := RemHead(files))
gad_progress.set(PLA_SimpleGauge_Current, i++)
D('[DOWNLOAD] file \s\n', [cdFileId(cd), NIL])
IF (rc := cddb(cd, arexx))
D('[DOWNLOAD] complete\n', NIL)
IF (tt_delete)
->-
->- skasuj niepotrzebny (juû) identyfikator pîyty w katalogu TMP
->-
StrCopy(tmp, tt_temp)
AddPart(tmp, cdFileId(cd), 255)
DeleteFile(tmp)
D('[DOWNLOAD] delete cdid file \s\n', [tmp, NIL])
ELSE
->-
->- zmieï nazwe pliku w katalogu TEMP
->-
renametemp(cd, '.ok')
D('[DOWNLOAD] mark cdid file \s as OK!\n', [tmp, NIL])
ENDIF
ELSE
->-
->- licznik niepowodzeï przy ôciâganiu opisów
->-
bad++
ENDIF
cdFreeInfo(cd)
IF (rc = FALSE) THEN Raise()
gad_progress.set(PLA_SimpleGauge_Current, i)
ENDWHILE
->-
->- zakoïczone pomyôlnie
->-
rc := TRUE
EXCEPT DO
IF (exception)
D('[DOWNLOAD] error \s\n', [exception, NIL])
IF (arexx)
->-
->- procedura zostaîa wywoîana z poziomu arexx'a wiëc wszelkie komunikaty
->- o bîëdach wîaônie tam bëdâ przekazane
->-
arexx.err := exception
arexx.rclong := 0
ELSE
->-
->- domyôlnie bëdzie wyôwietlony requester
->-
DisplayBeep(NIL)
guiInformUser(exception, NIL, exceptioninfo)
ENDIF
ELSE
->-
->- jeûeli downloading zakoïczyî sië (ogólnie) pomyôlnie to
->- wyôwietl podsumowanie (o ile nie jest w trybie Arexx'a)
->-
IF (arexx = NIL)AND(rc) THEN guiInformUser('Progress Report\n%ld file(s) in TEMP directory\n%ld file(s) processed\n%ld file(s) downloaded', NIL, [max, i, (i - bad), NIL])
ENDIF
guiGadgetAble(gad_writeid, FALSE)
guiGadgetAble(gad_download, FALSE)
guiGadgetAble(gad_abort, TRUE)
IF (setup_net) THEN netCleanUp()
freeallfiles(files)
ENDPROC rc
->-
->- prywatne
->- procedury wspomagajâce obsîugë plików
->-
PROC scanfiles(files:PTR TO lh, dir:PTR TO CHAR)
->-
->- procedura skanujâca ûâdany katalog i doîâczajâca wyszukane pliki jako
->- struktury cdinfo do listy
->- skanowanie jest selektywne - z filtrem ID~(#?.#?) przepuszczajâcym tylko pliki
->- zaczynajâce sië od ID i nie zawierajâce w nazwie kropki
->-
DEF fl, eac:PTR TO exallcontrol, ed:PTR TO exalldata, p:PTR TO exalldata
DEF more=DOSTRUE, res2, rc=FALSE, n, cd
DEF hook:hook, path[255]:STRING, parseBuffer:PTR TO CHAR
DEF handle=NIL
IF IsListEmpty(files)=FALSE THEN freeallfiles(files)
IF (fl := Lock(dir, SHARED_LOCK))
IF (eac := AllocDosObject(DOS_EXALLCONTROL, NIL))
IF (ed := New(BUFFERSIZE))
IF (parseBuffer := New(PARSESIZE)) THEN ParsePatternNoCase('ID~(#?.#?)', parseBuffer, PARSESIZE)
->-
->- hook identyfikacji odczytywanych pozycji
->-
inithook(hook, {matchFunc})
eac.matchfunc := hook
->-
->- inicjalizacja struktury exallcontrol, pattern parsing jest zawsze aktywny!
->-
eac.lastkey := 0
eac.matchstring := IF (parseBuffer) THEN parseBuffer ELSE NIL
->-
->- odczytaj WSZYSTKIE elementy katalogu
->-
WHILE (more <> DOSFALSE)
more := ExAll(fl, ed, BUFFERSIZE, ED_SIZE, eac)
res2 := IoErr()
->-
->- obróbka odczytanej pozycji katalogu (otwieranie sterowników kart)
->-
p := ed; n := eac.entries
WHILE (n)
->-
->- dla kaûdego pliku konstruuj peînâ ôcieûkë dostëpu i odczytuj zawartoôê
->-
StrCopy(path, dir)
AddPart(path, p.name, 255)
IF (handle := Open(path, MODE_OLDFILE))
cd := cdRawInfo()
IF (cd) THEN IF cdReadInfo(cd, handle) THEN AddHead(files, cd)
Close(handle)
ENDIF
p := p.next
n--
ENDWHILE
->-
->- zaznacz, ûe wszystkie elementy zostaîy odczytane
->-
IF (more = DOSFALSE)AND(res2 = ERROR_NO_MORE_ENTRIES) THEN rc := TRUE
ENDWHILE
Dispose(ed)
Dispose(parseBuffer)
ENDIF
FreeDosObject(DOS_EXALLCONTROL, eac)
ENDIF
UnLock(fl)
ENDIF
ENDPROC rc
PROC matchFunc(hook:PTR TO hook,p,ed:PTR TO exalldata)
->-
->- funkcja zapewniajâca pomijanie wszelkich linków w liôcie plików
->- zwraca TRUE/FALSE (TRUE gdy plik nadaje sië do doîâczenia do listy)